package com.boom.springapp.javafxdemo;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;

import java.io.IOException;
import java.util.Objects;

/**
 * Spring Boot + JavaFX 主启动类
 * 继承JavaFX Application类，实现Spring Boot集成
 */
public class MainApplication extends Application {

    private ConfigurableApplicationContext applicationContext;

    @Override
    public void init() throws Exception {
        // 启动Spring Boot应用上下文
        // 注意：这里传递的参数是给Spring Boot的，如果不需要可以传空数组
        applicationContext = new SpringApplicationBuilder()
                .sources(App.class) // 使用一个独立的Spring配置类
                .run(); // 传入空参数，因为我们不需要从命令行传递给Spring
    }

    @Override
    public void start(Stage primaryStage) throws IOException {
        // 加载FXML文件
        FXMLLoader loader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml"));

        // 设置控制器工厂，让Spring管理控制器
        loader.setControllerFactory(applicationContext::getBean);

        Scene scene = new Scene(loader.load(), 900, 680);
        primaryStage.setTitle("哔哩哔哩评论观察者");
        primaryStage.setScene(scene);
        Image icon = new Image(Objects.requireNonNull(MainApplication.class.getResourceAsStream("/icons/icon.png")));
        primaryStage.getIcons().add(icon);
        primaryStage.show();
    }

    @Override
    public void stop() throws Exception {
        // 关闭Spring应用上下文
        if (applicationContext != null) {
            applicationContext.close();
        }
        super.stop();
    }

    public static void main(String[] args) {
        launch(args);
    }
}